/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.servinf.ani.sincronizador.utils;

import com.servinf.ani.mapper.AssignmentMapper;
import com.servinf.ani.sincronizador.entities.Concesionaria;
import com.servinf.ani.sincronizador.entities.Departamento;
import com.servinf.ani.sincronizador.entities.EstadoIniciativa;
import com.servinf.ani.sincronizador.entities.EstadoIntervencion;
import com.servinf.ani.sincronizador.entities.SubEstadosParaProyectos;
import com.servinf.ani.sincronizador.entities.TipoInicitativa;
import com.servinf.ani.sincronizador.entities.TipoIntervencion;
import com.servinf.ani.sincronizador.entities.TipoProyecto;
import com.servinf.ani.sincronizador.entities.TramoVia;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 *
 * @author mortiz
 */
public class RelationMaps {
    
        private static RelationMaps instance;
        //Mapas de relaciones que tienen como llave los Strings que vienen en el archivo de Excel,
        //Como valor se encuentra los ids en Base de datos de las relaciones.
        
        private static Map<String, Integer> projectTypesMap = new HashMap<String, Integer>(); //Mapa de los tipos de proyecto (3g, 4g)
        private static Map<String, Integer> initiativeTypeMap = new HashMap<String, Integer>(); //Mapa de los tipos de inciiativa (Privada, Pública)
        private static Map<String, Integer> initiativeStateMap = new HashMap<String, Integer>(); //Mapa de los estados de la iniciativa privada(Factibilidad)
        private static Map<String, Integer> statesMap = new HashMap<String, Integer>(); //Mapa de los estados del proyecto.
        private static Map<String, Integer> departmentMap = new HashMap<String, Integer>(); //Mapa de los departamentos
        
        public static Map<String, String>  lanesInExcelMap = new HashMap<String, String>(); //Mapa de los tramos que están en excel, Key = nombre , Value = IdProject
        private static Map<String, Integer> lanesMap = new HashMap<String, Integer>(); //Mapa de los tramos que están en Base de datos.

        private static Map<String, Integer> assignmentStateMap = new HashMap<String, Integer>();
        private static Map<String, Integer> assignmentTypeMap = new HashMap<String, Integer>();
        
        private static Map<String, Integer> concessionsMap = new HashMap<String, Integer>();

        private RelationMaps() {}

        public static RelationMaps getInstance() {
            if(instance == null) {
                instance = new RelationMaps();
            }
            return instance;
        }
        
        /**
         * @return the projectTypesMap
         */
        public Map<String, Integer> getProjectTypesMap() {
            return projectTypesMap;
        }

        /**
         * @param aProjectTypesMap the projectTypesMap to set
         */
        public void setProjectTypesMap(List<TipoProyecto> types) {
            for(TipoProyecto type : types) {
                projectTypesMap.put(type.getNombreTipoProyecto(), type.getIdTipoProyecto());
            }
        }
        
        /**
         * @return the initiativeTypeMap
         */
        public Map<String, Integer> getInitiativeTypeMap() {
            return initiativeTypeMap;
        }

        /**
         * @param aInitiativeTypeMap the initiativeTypeMap to set
         */
        public void setInitiativeTypeMap(List<TipoInicitativa> types) {
            for(TipoInicitativa type : types) {
                initiativeTypeMap.put(type.getNombreIniciativa(), type.getIdTipoIniciativa());
            }
        }
        
         /**
         * @return the initiativeStateMap
         */
        public Map<String, Integer> getInitiativeStateMap() {
            return initiativeStateMap;
        }

        /**
         * @param aInitiativeStateMap the initiativeStateMap to set
         */
        public void setInitiativeStateMap(List<EstadoIniciativa> initiativeStates) {
             for(EstadoIniciativa state : initiativeStates) {
                initiativeStateMap.put(state.getNombreEstado(), state.getIdEstado());
            }
        }
        
        /**
        * @return the statesMap
        */
       public Map<String, Integer> getStatesMap() {
           return statesMap;
       }

       /**
        * @param aStatesMap the statesMap to set
        */
       public void setStatesMap(List<SubEstadosParaProyectos> states) {
           for(SubEstadosParaProyectos state : states) {
                statesMap.put(state.getNombreSubEstado(), state.getIdSubEstado() );
           }
       }
       
       /**
        * @return the departmentMAp
        */
       public Map<String, Integer> getDepartmentMap() {
           return departmentMap;
       }

       /**
        * @param aStatesMap the statesMap to set
        */
       public void setDepartmentMap(List<Departamento> departments) {
           for(Departamento department : departments) {
                departmentMap.put(department.getNombreDpto(), department.getCodigoDpto());
           }
       }
       
       
        /**
         * @return the lanesInExcel
         */
        public Map<String, String> getLanesInExcel() {
            return lanesInExcelMap;
        }

        /**
         * Arma un mapa a partir de los nombres de los tramos en excel. donde la llave es el nombre
         * y el valor es el id del proyeco al que pertenece.
         * @param aLanesInExcel the lanesInExcel to set
         */
        public static void setLanesInExcel(List<List<Object>> excelAssignmentSheet) throws IOException {
            
            for(int i = 1 ; i < excelAssignmentSheet.size() ; i++) { //Empieza en 1 por que la fila 0 es el header.
                List<Object> assignment = excelAssignmentSheet.get(i);
                //Si no hay datos en la columna tramo, omitalo y siga el ciclo
                if((String) assignment.get(AssignmentMapper.Tramo_T) == null) {
                     LogHelper.Log(LogHelper.WARNING, "En la fila " + i + " no se indica un tramo, para las intervenciones será obligatorio", null);
                     continue;
                }
                if((String) assignment.get(AssignmentMapper.IdDelProyecto) == null) {
                     LogHelper.Log(LogHelper.ERROR, "El id del proyecto es obligatorio, en la fila " + i + " es nulo", null);
                     continue;
                }
                String projectId = (String) assignment.get(AssignmentMapper.IdDelProyecto);
                String laneName = (String) assignment.get(AssignmentMapper.Tramo_T);
                lanesInExcelMap.put(laneName, projectId);
            }
        }
        
        
        /**
        * @return the lanesMap
        */
       public Map<String, Integer> getLanesMap() {
           return lanesMap;
       }

       /**
        * @param aLanesMap the lanesMap to set
        */
       public void setLanesMap(List<TramoVia> lanes) {
           for(TramoVia lane : lanes) {
                lanesMap.put(lane.getNombre(), lane.getCodigoVia());
           }
       }
       
       /**
     * @return the assignmentStateMap
     */
    public Map<String, Integer> getAssignmentStateMap() {
        return assignmentStateMap;
    }

    /**
     * @param aAssignmentStateMap the assignmentStateMap to set
     */
    public void setAssignmentStateMap(List<EstadoIntervencion> statesList) {
        for(EstadoIntervencion state : statesList) {
            assignmentStateMap.put(state.getNombreEstadoIntervencion(), state.getIdEstadoInterv());
        }
    }

    /**
     * @return the assignmentTypeMap
     */
    public Map<String, Integer> getAssignmentTypeMap() {
        return assignmentTypeMap;
    }

    /**
     * @param aAssignmentTypeMap the assignmentTypeMap to set
     */
    public void setAssignmentTypeMap(List<TipoIntervencion> typesList) {
        for(TipoIntervencion type : typesList) {
            assignmentTypeMap.put(type.getNombreTipo(), type.getIdTipo());
        }
    }
    
    /**
     * @return the concessionsMap
     */
    public Map<String, Integer> getConcessionsMap() {
        return concessionsMap;
    }

    /**
     * @param aConcessionsMap the concessionsMap to set
     */
    public void setConcessionsMap(List<Concesionaria> concessionsList) {
        for(Concesionaria concession : concessionsList) {
            concessionsMap.put(concession.getNombreConcesionario(), concession.getIdConcesionario());
        }
    }

        
        
}
